home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / basic / pbclon20.zip / PBCLONE.DOC < prev    next >
Text File  |  1992-10-16  |  48KB  |  1,044 lines

  1.                      The PBClone Library
  2.                    =---------------------=
  3.                          Version 2.0
  4.  
  5.     PBCLONE  Copyright (c) 1990-1992  Thomas G. Hanlin III
  6.  
  7.  
  8.  
  9. This software requires Library Wizard (LIBWIZxx.ZIP).
  10.  
  11. This is PBClone, a library of over 500 assembly language and
  12. BASIC routines for use with Microsoft's BASIC compilers:
  13. Bascom, PDS, QuickBasic and Visual BASIC for DOS.  The PBClone
  14. collection is copyrighted and may be distributed only under the
  15. following conditions:
  16.  
  17.    All PBClone files must be distributed together as a unit.
  18.    No files may be altered, added, or deleted from this unit.
  19.  
  20. You use this library at your own risk.  It has been tested by
  21. me on my own computer, but I will not assume any responsibility
  22. for any problems which PBClone may cause you.  If you do run
  23. into a problem, please let me know about it, and I will do my
  24. best to verify and repair it.
  25.  
  26. It is expected that if you find PBClone useful, you will
  27. register your copy.  You may not use PBClone routines in
  28. programs intended for sale unless you have registered.
  29.  
  30. Registration gets you the latest version of PBClone, complete
  31. with full source code.  The assembly language code is designed
  32. for MASM 6.0 and may require alteration for other assemblers.
  33.  
  34. The PBClone library is too large for BASIC to readily handle as
  35. a unit.  It is strongly recommended that you use LIBWIZ to make
  36. a customized subset of PBClone which contains only the routines
  37. you expect to use.  LIBWIZ should be available from the place
  38. where you obtained PBClone.
  39.  
  40. You will need to have a complete set of PBClone .OBJ files for
  41. LIBWIZ to work.  Create a fresh subdirectory and extract the
  42. BASIC sources from PBC$BAS.ZIP (or .LZH).  Compile them all.
  43. The following DOS command will do it:
  44.  
  45.    FOR %x IN (*.BAS) DO BC %x /o;
  46.  
  47. Now extract the .OBJ files from PBC$MAIN.LIB into the same
  48. directory, using the UnLib utility that comes with LIBWIZ.
  49. Finally, extract the .OBJ files from PBC$NEAR.LIB as well. This
  50. gives you a complete set of .OBJs for PBClone, allowing LIBWIZ
  51. to create a custom PBClone library for you.
  52.  
  53. The VB-DOS compiler always uses far strings.  You must use the
  54. .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  55.  
  56. With PDS, you have a choice between near and far strings.  To
  57. use far strings, use the /FS switch when compiling, and use the
  58. .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  59.  
  60.                      Creating .QLB files
  61.  
  62.  
  63.  
  64. If you like to use the BASIC editor/environment, you will need
  65. to create a .QLB version of the library to complement the .LIB
  66. version.  LIBWIZ can do it for you, or you can do it manually.
  67. This is done using the LINK.EXE utility that came with your
  68. compiler.  The exact parameters differ slightly depending on
  69. which version of the compiler you have.  For QuickBasic, it
  70. looks something like this:
  71.  
  72.    LINK libname.LIB/Q/SE:1024,libname.QLB,NUL,BQLB45;
  73.  
  74. The BQLB45 file is for QuickBasic 4.5.  This should be replaced
  75. by BQLB40 or BQLB41 for QuickBasic 4.0 (check your files to see
  76. which you have).  For BASCOM 6.0-7.1, also called Professional
  77. Development System or PDS, use QBXQLB instead of BQLB45.  For
  78. VB-DOS, use VBDOSQLB instead of BQLB45.
  79.  
  80. Since you'll probably want to do this again in the future when
  81. you get a new version of BasWiz or PBClone, I'd suggest you
  82. create a batch file or alias to do the work for you.  If you
  83. have 4DOS, an alias such as the following will do it:
  84.  
  85.    ALIAS QLB LINK %%1.LIB/Q/SE:512,%%1.QLB,NUL,BQLB45;
  86.  
  87. In this case, you can do the conversion simply by typing:
  88.  
  89.    QLB libname
  90.  
  91.                      The TSR File Viewer
  92.  
  93.  
  94.  
  95. Since there are hundreds of routines in PBClone, it isn't
  96. always exactly easy to remember which routine you want or how
  97. to use it.  This is a particular problem when you're in the
  98. middle of writing a program.  So, I've written a TSR file
  99. viewer... it's crude, but it gets the job done.
  100.  
  101. Just type "FV" to install the TSR.  Alt-V activates it.  "FV
  102. /D" removes it from memory.
  103.  
  104.      !!! ----== NOTE ==---- !!!
  105. Please check FV with a nonessential application first!  It
  106. appears to work fine in the QuickBasic environment, but it
  107. locks up my favorite editor, so I can't guarantee that it will
  108. behave properly in all circumstances.
  109.  
  110. First, FV will ask you for the file to view.  This may contain
  111. drive and subdirectory information as well as the file name.
  112. Second, you will be asked for a search string.  If you enter a
  113. search string, viewing will start at the part of the file that
  114. contains that search string.  If you just press enter, viewing
  115. will start at the beginning of the file.  The file will be
  116. presented to you one page at a time.  I suggest viewing
  117. PBCLONE.DOC or PBCLONE.INF.
  118.  
  119. FV was written in BASIC using Crescent's P.D.Q. library, with
  120. the "simplified" TSR handler (which doesn't seem to have been
  121. entirely debugged).  Then again, TSRs are a tricky matter,
  122. especially with BASIC...
  123.  
  124.                         General Notes
  125.  
  126.  
  127.  
  128. The initial version of PBClone had only one manual.  However,
  129. since there are so many routines, I've split the manual into a
  130. general documentation file and two reference manuals.  You
  131. won't want to print PBCLONE1.MAN and PBCLONE2.MAN unless you
  132. have a lot of time and printer paper!  In contrast, this file
  133. (PBCLONE.DOC) has been kept small to allow ready printing.  It
  134. contains general notes, cross-reference listings of the
  135. routines, and assorted charts.
  136.  
  137. Many of the routines in PBClone are similar to routines of the
  138. same name in ADVBAS and/or ProBas.  The key here is "similar"--
  139. they don't necessarily work the same way and may not produce
  140. the same results.  If you intend to convert from ADVBAS or
  141. ProBas to PBClone, read the documentation carefully.
  142.  
  143. When a PBClone returns a Boolean (on or off) value, it will
  144. always be 0 if off, -1 if on; this is unlike ProBas, which
  145. would often return any non-zero value for an "on" state.
  146. Booleans passed to PBClone may still use any non-zero value to
  147. indicate a "true" or "on" condition, however.
  148.  
  149. Critical error handling has been incorporated into all disk and
  150. device routines.  You will never have to worry about "R>etry,
  151. A>bort, I>gnore" again, so long as you use PBClone for your
  152. disk and device management.
  153.  
  154. PBClone file handling is very flexible but may be confusing to
  155. people used to BASIC's strongly-moded files.  PBClone file
  156. handling is most similar to BASIC files opened in BINARY mode.
  157. You may read or write any amount of information at a time.
  158. After each read or write takes place, the file pointer is
  159. updated appropriately, so you can use sequential access
  160. techniques without further effort.  Random access is also
  161. possible, using FSetLoc/FSetOfs/FSetRec to set the file pointer
  162. position.  Those of you who are familiar with C or Pascal file
  163. handling will notice strong similarities in this approach,
  164. which is based on techniques that have long been standard in
  165. the industry.
  166.  
  167. Many routines are available both as SUBprograms and as
  168. FUNCTIONs.  The former is for compatibility with older programs
  169. which were designed before BASIC was capable of using
  170. FUNCTIONs.  You may use either, of course, although the
  171. FUNCTION version of a routine is often more convenient.
  172.  
  173.                         General Notes
  174.  
  175.  
  176.  
  177. The PBClone library can be used in conjunction with other
  178. libraries.  If there is a conflict in routine names between the
  179. two libraries, the OBJTOOL utility can be used to rename one or
  180. the other routine.  Due to the large size of PBClone, you will
  181. probably need to select just the routines you need, rather than
  182. combining the entire libraries, in order to avoid overflowing
  183. LINK limitations.  OBJTOOL can help you find out which routines
  184. are in what modules.  The LIB utility can be used to alter
  185. existing libraries, or you can build your own custom libraries
  186. from the ground up, using LIBWIZ.  See the LIB_BI.DOC and
  187. LIBRARY.TXT files if you are not familiar with libraries.
  188.  
  189. LIBWIZ and OBJTOOL are included on the sampler disk that comes
  190. with the registered version of PBClone.  They should also be
  191. available at your local BBS.
  192.  
  193. If you have not used ADVBAS, ProBas, or PBClone before, you may
  194. be unfamiliar with the array handling conventions used here.
  195. In almost all array routines, you will see a pair of parameters
  196. (e.g. DSeg% and DOfs%) used to represent an array.  These
  197. values are obtained by the BASIC functions VARSEG and VARPTR:
  198.  
  199.    DSeg% = VARSEG(Array(1))    ' or whatever the first...
  200.    DOfs% = VARPTR(Array(1))    ' ...desired element may be
  201.  
  202. This is the way that current versions of QuickBasic and BASCOM
  203. pass arrays, TYPEd values, and fixed-length STRING values to
  204. assembly-language routines.  It tells the routine where in
  205. memory to find the value(s).  Since these values may move
  206. around in memory, it is important to get the VARSEG and VARPTR
  207. just before you call the routine.  Any routine that accepts a
  208. segment and an offset can be used with arrays, TYPEd values,
  209. and fixed-length strings interchangeably.  This allows for
  210. considerable flexibility.
  211.  
  212. Virtually all of the variables used in PBClone are integers.
  213. In this manual, integers are indicated specifically by use of
  214. the "%" integer postfix.  The use of DEFINT A-Z in your program
  215. will cause your variables to be integers by default, which I
  216. would recommend unless you use floating point heavily.
  217.  
  218.                         General Notes
  219.  
  220.  
  221.  
  222. Most of the routines in ProBas (and all of the routines in
  223. ADVBAS) did not require a DECLARE if the CALL syntax was used.
  224. This is not true of PBClone, which requires DECLAREs.  There
  225. are numerous advantages to this:
  226.  
  227.    1) BASIC can more easily detect syntax errors.
  228.    2) You may use CALL or the new simplified syntax.
  229.    3) Many of the routines are smaller and faster due to
  230.       use of the DECLARE option BYVAL.
  231.  
  232. The DECLAREs are generated in a .BI file by LIBWIZ.  Assuming
  233. you named the library PBC, you can include the DECLAREs in your
  234. program with this statement:
  235.  
  236.    REM $INCLUDE: 'PBC.BI'
  237.  
  238. The PBC.BI file must be in the same directory as your program,
  239. or you can put it into a specific directory by setting an
  240. environment variable.  I keep my include files in a directory
  241. called C:\INCLUDE, so I have the following line in my
  242. AUTOEXEC.BAT:
  243.  
  244.    SET INCLUDE=C:\INCLUDE
  245.  
  246. As mentioned, there are now two ways of calling any
  247. subprogram.  You can use the CALL keyword or an implicit call.
  248. In the case of the CopyFile routine, for instance, you could
  249. use either of these calls interchangeably:
  250.  
  251.    CALL CopyFile (FromFile$, ToFile$, ErrCode%)
  252.  
  253.    CopyFile FromFile$, ToFile$, ErrCode%
  254.  
  255. The latter technique is more elegant, to my tastes, and is the
  256. one used throughout the PBClone documentation and examples.
  257. You may use whichever method you prefer-- BASIC generates the
  258. same code either way.
  259.  
  260. How you capitalize the names of the variables and routines is
  261. up to you.  I like mixed uppercase and lowercase, but it really
  262. doesn't matter.  You can also change the names of the variables
  263. or even replace them with constants, as long as you maintain
  264. the correct type:
  265.  
  266.    COPYfile "C:\AUTOEXEC.BAT", "A:AUTOEXEC.BAT", errornumber%
  267.  
  268.                         General Notes
  269.  
  270.  
  271.  
  272. If you have registered PBClone and wish to reassemble all of the
  273. routines written in assembly language, first place these
  274. routines in their own subdirectory.  Then:
  275.  
  276.    FOR %x IN (*.ASM) DO MASM %x ;
  277.  
  278. Note that you will need to use "%%x" instead of "%x" if you
  279. place this statement in a batch file.
  280.  
  281. The .OBJ files created by this process will be compatible with
  282. QuickBasic strings and PDS near strings.  If you have PDS and
  283. would like to create a far string version of PBClone, you must
  284. set the FarString label when assembling.  Far strings are also
  285. required for the Escher compiler.
  286.  
  287.    FOR %x IN (*.ASM) DO MASM %x /DFarString ;
  288.  
  289. You can most readily create a library from the resulting .OBJ
  290. files by using the LIBWIZ utility.  Due to the size of PBClone,
  291. manual library creation is not recommended.
  292.  
  293. If you find any bugs or problems with PBClone, or have any
  294. suggestions to make, please let me know.  You can reach me
  295. through any of the BBSes listed in WHERE.BBS, or write to me by
  296. conventional mail.  Please DO NOT call me directly!  I loathe a
  297. ringing phone.  Phones were meant for modem use only!
  298.  
  299.                       Routine Reference
  300.  
  301.  
  302.  
  303. Array Management:
  304.    AddMatI       add to each element of an integer array
  305.    AddMatL       add to each element of a long integer array
  306.    BinSeekD      search a sorted array of double-precision nos.
  307.    BinSeekI      search a sorted array of integers
  308.    BinSeekL      search a sorted array of long integers
  309.    BinSeekS      search a sorted array of single-precision nos.
  310.    BinSeekSt     search a sorted array of strings
  311.    DRecDel       delete a record or element from an array
  312.    DRecIns       insert a record or element into an array
  313.    InitPtr       initialize an array of pointers
  314.    MeanAverageD  calculate the average of a double-prec. array
  315.    MeanAverageI  calculate the average of an integer array
  316.    MeanAverageL  calculate the average of a long integer array
  317.    MeanAverageS  calculate the average of a single-prec. array
  318.    MulMatI       multiply each element of an integer array
  319.    PSortD        pointer-sort a double-prec. array
  320.    PSortI        pointer-sort an integer array
  321.    PSortL        pointer-sort a long integer array
  322.    PSortS        pointer-sort a single-prec. array
  323.    PSortSt       pointer-sort a string array
  324.    ReverseD      reverse the elements in a double-prec. array
  325.    ReverseI      reverse the elements in an integer array
  326.    ReverseL      reverse the elements in a long integer array
  327.    ReverseS      reverse the elements in a single-prec. array
  328.    ReverseSt     reverse the elements in a string array
  329.    SetMatI       set each element of an integer array
  330.    SetMatL       set each element of a long integer array
  331.    SortD         sort an array of double-precision numbers
  332.    SortI         sort an array of integers
  333.    SortL         sort an array of long integers
  334.    SortS         sort an array of single-precision numbers
  335.    SortSt        sort an array of strings
  336.  
  337.                       Routine Reference
  338.  
  339.  
  340.  
  341. Disk:
  342.    BootDrive$    determine the drive used to boot the computer
  343.    CDROM         see if a CD-ROM is installed and get info
  344.    CheckDisk%    see if a disk is ready to be accessed
  345.    CheckShare%   determine whether SHARE is installed
  346.    DelSub        delete a subdirectory
  347.    DiskStat      get information on disk memory
  348.    DriveSpace&   see how much space is free on a disk
  349.    DrvType       see if a drive is removeable and/or networked
  350.    FDescRead$    read a 4DOS-style file description
  351.    FindFirstF    find the first file to match specs
  352.    FindFirstFx   find the first file to match specs
  353.    FindNextF     find any other files which match specs
  354.    FindNextFx    find any other files which match specs
  355.    Floppies%     see how many floppy drives are attached
  356.    FloppyType    see what types of floppy drives are installed
  357.    FReadLn       read a line of text from a file (LINE INPUT#)
  358.    GetAttrF      get attribute of a file matched by FindFirstF
  359.    GetAttrFx%    get attribute of a file matched by FindFirstFx
  360.    GetDateF      get date of a file matched by FindFirstF
  361.    GetDateFx$    get date of a file matched by FindFirstFx
  362.    GetDrive$     get the default drive
  363.    GetExecPath   get drive, subdir, name of current program
  364.    GetLabel      get a disk volume label
  365.    GetNameF      get the name of a file matched by FindFirstF
  366.    GetNameFx$    get the name of a file matched by FindFirstFx
  367.    GetSerial     get a disk serial number
  368.    GetSizeFL     get the size of a file matched by FindFirstF
  369.    GetSizeFx&    get the size of a file matched by FindFirstFx
  370.    GetSub        get the default subdirectory on a given drive
  371.    GetTimeF      get the time of a file matched by FindFirstF
  372.    GetTimeFx$    get the time of a file matched by FindFirstFx
  373.    GetVerify     determine status of the DOS "verify" setting
  374.    LoadDir       load names of matching files into an array
  375.    LoadDirAll    load all info about matching files into array
  376.    LogicalDrives% see how many logical drives are available
  377.    MakeSub       create a subdirectory
  378.    RenSub        rename a subdirectory
  379.    Retries       set the retries used for file networking
  380.    SetDrv        set the default drive
  381.    SetLabel      set a disk volume label
  382.    SetSub        set the default subdirectory
  383.    SetVerify     set the state of the DOS "verify" switch
  384.    SubExist%     determine whether a subdirectory exists
  385.  
  386.                       Routine Reference
  387.  
  388.  
  389.  
  390. Display:
  391.    BigPrint      display text in huge letters
  392.    BkSpace       backspace destructively with wrap
  393.    BkScroll      scroll an area of the screen down
  394.    Blink         switch blinking vs. intense background colors
  395.    CalcAttr%     calc color/attribute from fore & background
  396.    CalcSize      calc array size needed to save a screen area
  397.    CalcVGAColor  calculate a VGA palette color setting
  398.    ClearArea     clear an area of the screen w/ special effects
  399.    Clock         display a clock on the screen constantly
  400.    ClockSet      set various parameters for the clock
  401.    ClrCols       clear between specified columns on a row
  402.    ClrEOL        clear to the end of the row
  403.    ClrEOP        clear to the end of the screen
  404.    ClrSOL        clear to the start of the row
  405.    ClrSOP        clear to the start of the screen
  406.    CPrintScreen1 send a SCREEN 1 display to the printer
  407.    CPrintScreen2 send a SCREEN 2 display to the printer
  408.    CursorInfo    return cursor visibility, current & max sizes
  409.    CWindowManC   display pop-up window in CGA graphics mode
  410.    DClear        clear a display being kept in an array
  411.    DClearSS      clear a display of unusual size in an array
  412.    DelChr        delete a character from the screen
  413.    DelLine       delete a row from the screen
  414.    DGClear       clear a CGA virtual screen
  415.    DGetScreen    get an area of the screen into an array
  416.    DGQPrint      write to a CGA virtual screen (SCREEN 1 type)
  417.    DGXQPrint     write to a CGA virtual screen (SCREEN 2 type)
  418.    DGXQPrint1    write to a CGA virtual screen (SCREEN 2 type)
  419.    Dissolve      clear the screen with special effects
  420.    DMPrint       display text directly through DOS services
  421.    DOSClrEol     clear from the cursor to end of line via DOS
  422.    DOSCls        clears the screen using DOS output
  423.    DOSColor      sets the screen color using DOS output
  424.    DOSLocate     sets the cursor position using DOS output
  425.    DPutScreen    put an array onto an area of the screen
  426.    DRecolor      recolor text of a specified color in an array
  427.    DRecolorArea  recolor a block of text in an array
  428.    DScrRest      restore a saved screen from an array
  429.    DScrSave      save a screen to an array or other memory
  430.    DWindowMan    make a pop-up window in an array
  431.    DWindowMan2   pop-up window in an array (definable frames)
  432.    DWindowMan3   pop-up window in an array (array-based parms)
  433.    DWindowMan4   pop-up window in an array (Spartan version)
  434.    DXQPrint      write text into an array
  435.    EGARest7      restore a saved screen to EGA SCREEN 7 display
  436.    EGARest8      restore a saved screen to EGA SCREEN 8 display
  437.    EGARest9      restore a saved screen to EGA SCREEN 9 display
  438.    EGASave7      save an EGA SCREEN 7 display to an array
  439.    EGASave8      save an EGA SCREEN 8 display to an array
  440.    EGASave9      save an EGA SCREEN 9 display to an array
  441.  
  442.                       Routine Reference
  443.  
  444.  
  445.  
  446. Display:
  447.    EWindowManC   display pop-up window on EGA/VGA graphics
  448.    EXQPrintC     display text at high speed on EGA/VGA graphics
  449.    FadeOut       clear the screen with special effects
  450.    GetColor      get the current colors being used by BASIC
  451.    GetCRT%       determine whether the display is color or mono
  452.    GetEGA        see if an EGA is in use and get info about it
  453.    GetEGA2%      see if an EGA is in use
  454.    GetHGA%       see if a Hercules mono adapter is in use
  455.    GetLine       get a row of text from virtual or saved screen
  456.    GetNoSnow%    get anti-snow setting used by PBClone routines
  457.    GetPage%      get screen page used by PBClone routines
  458.    GetRows%      see how many rows are on the screen
  459.    GetScreen     get an area of the screen into an array
  460.    GetVGA%       see if a VGA is in use
  461.    GetVGAColor   get the specified VGA palette setting
  462.    GetVGAPalette get the specified VGA palette settings
  463.    GetVidMode    get display mode and other screen info
  464.    GQPrint       display text quickly in CGA SCREEN 2 mode
  465.    GrafPrint     display sized text at graphics coordinates
  466.    GrafRest      restore a saved CGA graphics screen
  467.    GrafSave      save a CGA graphics screen to an array
  468.    GXQPrint      display text quickly in CGA SCREEN 1
  469.    GXQPrint1     display text quickly in CGA SCREEN 1
  470.    HCls          clear screen in Hercules graphics mode
  471.    HiLite        highlight text on the screen
  472.    HLine         draw a line in Hercules graphics mode
  473.    HMode         switch between text and Herc graphics modes
  474.    HPrint        display text in Hercules graphics mode
  475.    HSetPixel     plot a point in Hercules graphics mode
  476.    HTestPixel    get the color of a point in Herc graphics mode
  477.    InsChr        insert a space onto the screen
  478.    InsLine       insert a blank row onto the screen
  479.    LScroll       scroll an area of the screen left
  480.    MPrint        display text through DOS, obeying MWindow
  481.    MWindow       sets a display region for MPrint
  482.    PrintScreen   print the screen on a printer
  483.    PutScreen     put an array onto an area of the screen
  484.    QPrint        display text very quickly
  485.    ReColor       change text of a selected color to a new color
  486.    ReColorArea   change text in a selected area to a new color
  487.    RScroll       scroll an area of the screen right
  488.    Scroll        scroll an area of the screen up
  489.    ScrRest       restore a saved screen from an array
  490.    ScrSave       save a screen to an array
  491.    Scrunch       compress a screen in an array
  492.    SetCGAColor   set various aspects of CGA colors
  493.    SetNoSnow     set anti-snow status for PBClone routines
  494.    SetPage       set the screen page for PBClone
  495.    SetVGAColor   set the specified VGA palette info (1 color)
  496.    SetVGAPalette set the specified VGA palette info (1+ colors)
  497.  
  498.                       Routine Reference
  499.  
  500.  
  501.  
  502. Display:
  503.    Split         clear the screen by scrolling different ways
  504.    TypePrint     display text as if it is being typed
  505.    UnCalcAttr    convert color/attribute to fore & background
  506.    UnScrunch     uncompress a "scrunched" screen
  507.    UnSplit       restore saved screen by scroll. different ways
  508.    VGARest13     restore a saved screen in VGA SCREEN 13 mode
  509.    VGASave13     save a VGA SCREEN 13 display to an array
  510.    WindowMan     display a pop-up window
  511.    WindowMan2    display a pop-up window (user-defined frames)
  512.    WindowMan3    display a pop-up window (array-based parms)
  513.    WindowMan4    display a pop-up window (spartan version)
  514.    XMPrint       display text through DOS after translation
  515.    XQPrint       display text very quickly
  516.    XQPrintOver   quick text display, overlaying existing text
  517.  
  518. Equipment:
  519.    AllExtMem&    see how much extended memory was found at boot
  520.    BootDrive$    determine the drive used to boot the computer
  521.    CDROM         see if a CD-ROM is installed and get info
  522.    CPUSpeed%     get the CPU speed in MHz
  523.    Equipment     find out about basic equipment (ports, memory)
  524.    ExtMem        see how much extended memory is available
  525.    Floppies%     see how many floppy drives are available
  526.    FloppyType    see what types of floppy drives are installed
  527.    Get4DOSv      get installed version of 4DOS, if any
  528.    GetCRT%       determine whether the display is color or mono
  529.    GetDOSv       get the DOS version
  530.    GetEGA        see if an EGA is in use and get info about it
  531.    GetEGA2%      see if an EGA is in use
  532.    GetExtM       see how much extended memory is available
  533.    GetHGA%       see if a Hercules mono adapter is in use
  534.    GetLIMm       see how much expanded memory is available
  535.    GetLIMv       get the EMS driver version
  536.    GetMouseVer   get mouse driver version and hardware info
  537.    GetVGA%       see if a VGA is in use
  538.    GetXMSm       see how much XMS memory is available
  539.    GetXMSv       get the XMS driver version
  540.    KbdType%      see if the keyboard is enhanced (101-key)
  541.    LogicalDrives% see how many logical drives are available
  542.    MMCheck       see if a mouse is available and # of buttons
  543.    NumProc%      see what kind of numeric coprocessor is in use
  544.    PCDate$       get the date of the ROM BIOS
  545.    PCType%       get the machine I.D. from the ROM BIOS
  546.    Processor%    see what kind of CPU is in use
  547.    WinCheck      see what version of Windows is running, if any
  548.  
  549.                       Routine Reference
  550.  
  551.  
  552.  
  553. File:
  554.    BRead         read a byte from a file into an integer
  555.    BWrite        write a byte to a file from an integer
  556.    CloseA        close an archive opened by FindFirstA
  557.    CopyFile      copy a single file
  558.    DelFile       delete a file
  559.    DFRead        read from a file into an array or other mem.
  560.    DFWrite       write to a file from an array or other memory
  561.    Exist%        see if a file exists
  562.    ExplainFAttr$ return a text explanation of a file attribute
  563.    ExtendFSpec   check, complete, and format a filespec
  564.    FClose1       close a file
  565.    FCreate       create a file and open it for access
  566.    FGetLoc%      get the position of a file pointer
  567.    FileCopy      copy one or more files
  568.    FileCount     count the number of matching files
  569.    FileCRC       calculate a 32-bit CRC for a file
  570.    FindFirstA    find the first file in an archive
  571.    FindNextA     find any other files in an archive
  572.    FindPatch     find where to patch an .EXE
  573.    FlushToDisk   flush a file to disk (force it to be updated)
  574.    FOpen1        open a file
  575.    ForceMatch$   force a filename to match a wildcard pattern
  576.    FSetEnd       move to the end of a file
  577.    FSetLoc       move to a specific location in a file
  578.    FSetOfs       move backwards or forwards within a file
  579.    FSetRec       move to a specific record location in a file
  580.    FSetSize      set the size of a file
  581.    FSize&        get the size of a file
  582.    GetCRCA       get CRC-16 of a file matched by FindFirstA
  583.    GetCRCAL      get CRC-32 of a file matched by FindFirstA
  584.    GetDateA      get date of a file matched by FindFirstA
  585.    GetFAttr      get attribute of a file
  586.    GetFDate      get the date of a file
  587.    GetFSize&     get the size of a file
  588.    GetFTime      get the time of a file
  589.    GetNameA      get the name of a file matched by FindFirstA
  590.    GetSizeAL     get the size of a file matched by FindFirstA
  591.    GetStoreA     get storage type of file matched by FindFirstA
  592.    GetTimeA      get the time of a file matched by FindFirstA
  593.    GLoad         load a binary image from a file (like BLOAD)
  594.    IdentifyFile  try to identify a file
  595.    IRead         read an integer from a file
  596.    IWrite        write an integer to a file
  597.    LIRead        read an integer from a file into a long integer
  598.    LIWrite       write an integer to a file from a long integer
  599.    LRead         read a long integer from a file
  600.    LWrite        write a long integer to a file
  601.  
  602.                       Routine Reference
  603.  
  604.  
  605.  
  606. File:
  607.    MatchFile     see if a filename matches a wildcard filespec
  608.    ObjScan       scan an .OBJ file, return publics & externals
  609.    ParseFSpec    split filespec into drive, subdir, filename
  610.    PatchDone     terminates patching of an .EXE file
  611.    Rename        rename a file
  612.    SetFAttr      set the attribute of a file
  613.    SetFTD        set the time and date of a file
  614.    SetPatch      installs a patch into an .EXE file
  615.    SFRead        read from a file into a string
  616.    SFWrite       write from a string into a file
  617.  
  618.  
  619.  
  620. Input:
  621.    AltKey        returns letter from ASCII & scan codes of key
  622.    BarMenu       bar menu (single row) for keyboard only
  623.    BarMenuM      bar menu (single row) for keyboard or mouse
  624.    BIOSInkey     get a key from BIOS if any is waiting
  625.    BreakCheck    see if Break has been pressed
  626.    BreakOff      make sure Break doesn't interrupt the program
  627.    BreakOffDone  remove Break handler
  628.    CheckKey      get a key if any is waiting, or a mouse button
  629.    CheckKey3     get a key if any is waiting, or a mouse button
  630.    ClrKbd        clear the keyboard buffer
  631.    CtrlKey       returns letter, given ASCII code of Ctrl key
  632.    DInput        formatted dollar input routine
  633.    DOSInkey      get a key from DOS if any is waiting
  634.    DOSInky$      get a key from DOS if any is waiting
  635.    EnhKbd        enable/disable enhanced keyboard handling
  636.    GetKbd        get state of keyboard toggles (CapsLock, etc)
  637.    GetKbd1       get state of shift keys (Control, Alt, etc)
  638.    GetKbd2       get state of shift keys (Left/Right Alt, etc)
  639.    GetKey        get a key or mouse click (wait; 2-button)
  640.    GetKey3       get a key or mouse click (wait; 3-button)
  641.    GetValidKey   get one of a list of valid keys
  642.    KbdType%      see if the keyboard is enhanced (101-key)
  643.    KeyPress      see if a key is waiting to be retrieved
  644.    PrtSc         disable the PrtSc/PrintScreen key
  645.    ScanKey       get a key, if any, w/o taking it from buffer
  646.    SetKbd        set state of keyboard toggles (CapsLock, etc)
  647.    SetMouseLoc   set the mouse cursor position (text mode)
  648.    SInput        flexible replacement for LINE INPUT
  649.    SInputSet     set SInput parms (fill, exitmode, beeps, fast)
  650.    SInputSet1    set SInput parms (cursor position, full exit)
  651.    SInputSet2    set SInput parms (capitalize, tab exit)
  652.    SpeedKey      change the keyboard repeat rate
  653.    TypeIn        stuff keys into buffer as if they were typed
  654.  
  655.                       Routine Reference
  656.  
  657.  
  658.  
  659. Memory:
  660.    BlockMove     copy data from one area of memory to another
  661.    DataSeg       determine the default data segment (dgroup)
  662.    EMSBuffer     get the bytes needed to save EMS array state
  663.    EMSClose      close an EMS array
  664.    EMSGet        get an element from an EMS array
  665.    EMSOpen       create an EMS array
  666.    EMSPut        put an element into an EMS array
  667.    EMSRest       restore the EMS array state
  668.    EMSSave       save the EMS array state
  669.    ExtGet        get data from extended memory
  670.    ExtMem        see how much extended memory is available
  671.    ExtPut        put data into extended memory
  672.    FarPeek%      get byte from memory (like PEEK w/o DEF SEG)
  673.    FarPeekI%     get word from memory (like two PEEKs w/o DEF SEG)
  674.    FarPeekL&     get dword from memory (like four PEEKs w/o DEF SEG)
  675.    FarPoke       put byte into memory (like POKE w/o DEF SEG)
  676.    FarPokeI      put word into memory (like two POKEs w/o DEF SEG)
  677.    FarPokeL      put dword into memory (like four POKEs w/o DEF SEG)
  678.    GetExtM       see how much extended memory is available
  679.    GetLIMHandles get the number of EMS handles being used
  680.    GetLIMm       see how much expanded memory is available
  681.    GetLIMv       get the EMS driver version
  682.    GetXMSm       see how much XMS memory is available
  683.    GetXMSv       get the EMS driver version
  684.    LClose        close a block of expanded memory
  685.    LGet          get a block of data from expanded memory
  686.    LOpen         open a block of expanded memory
  687.    LPut          put a block of data into expanded memory
  688.    MemSwap       swap contents of one area of memory w/ another
  689.  
  690. Miscellaneous:
  691.    DOSErrM$      convert a DOS error code into a text message
  692.    DOSInt%       execute a DOS function (like CALL INTERRUPT)
  693.    DupeVar       copy a TYPEd variable into a different TYPE
  694.    CatchError    set up to grab exit code from SHELLed program
  695.    GetError      get the exit code from a SHELLed program
  696.    GetError2%    get the exit code from a SHELLed program
  697.    GetSwitch$    get the DOS switch character
  698.    HandleInfo    see if a handle refers to a file or a device
  699.    IntVector     get the address of an interrupt handler
  700.    Reboot        boot the computer (like Control-Alt-Del)
  701.    RedirectIn    see whether input has been redirected
  702.    RedirectOut   see whether output has been redirected
  703.    SetError      set exit code to return when program ends
  704.  
  705.                       Routine Reference
  706.  
  707.  
  708.  
  709. Mouse:
  710.    BarMenuM      bar menu (single row) for keyboard or mouse
  711.    CheckKey      get a key if any is waiting, or a mouse button
  712.    CheckKey3     get a key if any is waiting, or a mouse button
  713.    GetKey        get key or mouse click (wait for it; 2-button)
  714.    GetKey3       get key or mouse click (wait for it; 3-button)
  715.    GetMouse%     get mouse setting used by PBClone routines
  716.    GetMouseLoc   get the mouse cursor position (text mode)
  717.    GetMouseVer   get mouse driver version and hardware info
  718.    MMButton      see which mouse buttons are pressed (2-button)
  719.    MMButton3     see which mouse buttons are pressed (3-button)
  720.    MMCheck       see if a mouse is installed & no. of buttons
  721.    MMClick       see which buttons have been pressed (2-button)
  722.    MMClick3      see which buttons have been pressed (3-button)
  723.    MMCursorOff   make the mouse cursor invisible
  724.    MMCursorOn    make the mouse cursor visible
  725.    MMGetLoc      get the mouse cursor position
  726.    MMSetLoc      set the mouse cursor position
  727.    MMSetRange    set the allowable range of the mouse cursor
  728.    MouseBuffer   get no. of bytes needed to save mouse state
  729.    MouseCursor   set the mouse graphics cursor type
  730.    MousePen      turn light pen emulation by the mouse on/off
  731.    MouseRest     restore a saved mouse state
  732.    MouseSave     save the current state of the mouse
  733.    SetMouse      set mouse availability for PBClone routines
  734.    SetMouseLoc   set the mouse cursor position (text mode)
  735.  
  736.                       Routine Reference
  737.  
  738.  
  739.  
  740. Numeric:
  741.    Any2Dec       convert a number from any base into an integer
  742.    CeilD#        return the smallest integer >= number
  743.    CeilS!        return the smallest integer >= number
  744.    Dec2Any       convert an integer to any base
  745.    FloorD#       return the largest integer <= number
  746.    FloorS#       return the largest integer <= number
  747.    HiByte%       return the high byte of an integer
  748.    HiWord%       return the high word of a long integer
  749.    IVal%         convert a string to an integer
  750.    KVal%         convert a string to a long integer / 1024
  751.    LoByte%       return the low byte of an integer
  752.    LoWord%       return the low word of a long integer
  753.    LVal%         convert a string to a long integer
  754.    Max%          return the greater of two integers
  755.    MaxD#         return the greater of two double-prec. numbers
  756.    MaxL&         return the greater of two long integers
  757.    MaxS!         return the greater of two single-prec. numbers
  758.    Min%          return the smaller of two integers
  759.    MinD#         return the smaller of two double-prec. numbers
  760.    MinL&         return the smaller of two long integers
  761.    MinS!         return the smaller of two single-prec. numbers
  762.    Num2Phone$    convert a compressed phone number to a string
  763.    NumFormat     format a number as a string, like PRINT USING
  764.    Odd%          return whether an integer is odd
  765.    OddL%         return whether a long integer is odd
  766.    Phone2Num&    compress a phone number into a long integer
  767.    Rand%         return pseudo-random number in specified range
  768.    ReadBitF      read value of given bit length from an array
  769.    SetBit        set a specified bit in an integer
  770.    ShiftL        shift the bits in an integer left
  771.    ShiftLL       shift the bits in a long integer left
  772.    ShiftR        shift the bits in an integer right
  773.    ShiftRL       shift the bits in a long integer right
  774.    WriteBitF     write value of given bit length into an array
  775.  
  776. Printer:
  777.    CPrintScreen1 send a SCREEN 1 display to the printer
  778.    CPrintScreen2 send a SCREEN 2 display to the printer
  779.    GetPrtAddr    get the address of a printer port
  780.    PrinterReady% see if a printer is ready
  781.    PrinterInit   initialize a printer
  782.    PrintFile     send a file to the printer
  783.    PrintScreen   print the screen on the printer
  784.    PrtSc         disable the PrtSc/PrintScreen key
  785.    PrtSwap       swap any two printer ports
  786.    SetPrtAddr    set the address of a printer port
  787.    Spooler       see if DOS print spooler (PRINT.COM) is loaded
  788.  
  789.                       Routine Reference
  790.  
  791.  
  792.  
  793. Serial:
  794.    Carrier       determine if a carrier is present
  795.    Checksum%     calculate a checksum for a string
  796.    CRC           calculate a CRC for a string (obsolete)
  797.    CRC1          calculate a CRC for a string
  798.    DTR           set the state of the DTR line
  799.    GetCommAddr   get the address of a comm port
  800.    SetComm       set communications parameters
  801.    SetCommAddr   set the address of a comm port
  802.  
  803.  
  804.  
  805. String:
  806.    AndSt         AND the bytes in two strings together
  807.    AscI%         get the ASCII value of a character (like ASC)
  808.    AscM%         get the ASCII value of any char in a string
  809.    Bickel        compare two strings using Bickel's algorithm
  810.    BSq           compress the blanks out of a text string
  811.    BUsq          restore a string that was compressed by BSq
  812.    BUsqLen       determine expanded length of a BSq'ed string
  813.    CenterSt$     center a string
  814.    Checksum%     calculate a checksum
  815.    Cipher        perform simple string encryption/decryption
  816.    CipherP       like Cipher, only the results are printable
  817.    CRC           calculate a 16-bit CRC
  818.    Crunch        remove repeated values from a string
  819.    DGetRec       get a string from memory in a record format
  820.    DGetSt        get string from numeric array or other memory
  821.    DPutRec       put a string into memory in a record format
  822.    DPutSt        put string into numeric array or other memory
  823.    ExtendFSpec   check, complete, and format a filespec
  824.    Extract       extract a delimited substring from a string
  825.    ForceMatch$   force a filename to match a wildcard pattern
  826.    IsAlNum%      test whether a char. is alphabetic or numeric
  827.    IsAlpha%      test whether a character is alphabetic
  828.    IsASCII%      test whether a character is ASCII
  829.    IsCntrl%      test whether a character is a control code
  830.    IsDigit%      test whether a character is a digit
  831.    IsLower%      test whether a char. is lowercase alphabetic
  832.    IsPrint%      test whether a character is printable
  833.    IsPunct%      test whether a character is punctuation
  834.    IsSpace%      test whether a character is white space
  835.    IStr$         convert an integer to a string
  836.    IsUpper%      test whether a char. is uppercase alphabetic
  837.    IsXDigit%     test whether a char. is a hexadecimal digit
  838.    Locase        convert a string to lowercase (U.S. only)
  839.    Locase1       convert a string to lowercase (international)
  840.    LRotate       rotate the characters in a string left once
  841.  
  842.                       Routine Reference
  843.  
  844.  
  845.  
  846. String:
  847.    MatchFile     see if filename matches a wildcard filespec
  848.    Month         return the name of the month, given month no.
  849.    MultiAND      perform an arithmetic AND operation on string
  850.    MultiOR       perform an arithmetic OR operation on a string
  851.    MultiXOR      perform an arithmetic XOR operation on string
  852.    NameCase$     capitalize a string correctly for a name
  853.    Num2Phone$    convert a compressed phone number to a string
  854.    OrSt          OR bytes in one string with those in another
  855.    Phone2Num&    compress a phone number into a long integer
  856.    Replace       replace one character with another
  857.    ReplaceSt     replace one substring with another
  858.    Reverse       reverse a string
  859.    RInstr        find last occurrence of substring w/in string
  860.    RolSt         rotate the bits in a string left
  861.    RorSt         rotate the bits in a string right
  862.    RRotate       rotate the characters in a string right once
  863.    SFRead        read a string from a file
  864.    SFWrite       write a string to a file
  865.    ShlSt         shift the bits in a string left
  866.    ShrSt         shift the bits in a string right
  867.    Soundex       determine what a string "sounds" like
  868.    SSrch         see if one string is within another
  869.    StrDel        delete a character from a string
  870.    StrIns        insert a space into a string
  871.    Strip$        strip the blanks from both sides of a string
  872.    StripBlanks   strip the blanks from side(s) of a string
  873.    StripChar     strip a specified list of chars from a string
  874.    StripRange    strip a specified range of chars from a string
  875.    StripSpaces   strip the spaces from side(s) of a string
  876.    StrSqu$       compress text string using 2 & 3-gram compress.
  877.    StrSqu2       compress text string using 2-gram compression
  878.    StrSqu3       compress text string using 3-gram compression
  879.    StrSquLen2    determine 2-gram compressed length of string
  880.    StrSquLen3    determine 3-gram compressed length of string
  881.    StrUnsq$      uncompress a 2 & 3-gram compressed string
  882.    StrUnsqu2     uncompress a 2-gram compressed string
  883.    StrUnsqu3     uncompress a 3-gram compressed string
  884.    StrUnsquLen2  calc full length of 2-gram compressed string
  885.    StrUnsquLen3  calc full length of 3-gram compressed string
  886.    TInstr        search for a specific kind of char in a string
  887.    Upcase        convert a string to uppercase (U.S. only)
  888.    Upcase1       convert a string to uppercase (international)
  889.    UpcaseI       convert an ASCII code to uppercase (U.S. only)
  890.    UpcaseI1      convert ASCII to uppercase (international)
  891.    Xlate         run each char of a string through translation
  892.    XorSt         XOR bytes in one string with those in another
  893.  
  894.                       Routine Reference
  895.  
  896.  
  897.  
  898. Time:
  899.    CalcDate      get date a number of days from a starting date
  900.    CheckDate     check a date to determine whether it is valid
  901.    Clock         display a clock on the screen, constantly
  902.    ClockSet      set the parameters for the clock
  903.    Date2Int      squash a date into a single integer
  904.    DateA2R       convert a date to a number you can calc with
  905.    DateN2S       convert a date from numbers into a string
  906.    DateR2A       convert a number to a date
  907.    DateS2N       convert a date from string form into numbers
  908.    DCal          draw a calendar into an array for ScrRest
  909.    DCalendar     draw a calendar & let user to select date
  910.    Delay         delay for a given number of seconds
  911.    Delay18th     delay for a given number of 18ths of seconds
  912.    DelayV        delay for a very small amount of time
  913.    ElapsedTime$  determine the elapsed time between two times
  914.    EuropeDate    convert a date to European format
  915.    FormatDate    convert a date to any desired format
  916.    GetDateA      get the date of a file matched by FindFirstA
  917.    GetDateAT     get the date from the AT hardware clock
  918.    GetDateF      get date of a file matched with FindFirstF
  919.    GetDateFx$    get date of a file matched with FindFirstFx
  920.    GetFDate      get the date of a file
  921.    GetFTime      get the time of a file
  922.    GetTick&      get timer tick count (1/18th seconds)
  923.    GetTime       get time from DOS, including 100th seconds
  924.    GetTimeA      get the time of a file matched by FindFirstA
  925.    GetTimeAT     get the time from the AT hardware clock
  926.    GetTimeF      get time of a file matched with FindFirstF
  927.    GetTimeFx$    get time of a file matched with FindFirstFx
  928.    Int2Date      unsquash date from single integer to numbers
  929.    Int2DateSt$   unsquash date from single integer to string
  930.    Int2Time      unsquash time from single integer to numbers
  931.    Int2TimeSt$   unsquash time from single integer to string
  932.    Month         return name of month, given the month number
  933.    Sec2Time$     convert seconds past midnight to time string
  934.    SetDateAT     set the date of the AT hardware clock
  935.    SetTimeAT     set the time of the AT hardware clock
  936.    Time2Int      squash a time into a single integer
  937.    Time2Sec&     convert time string to seconds past midnight
  938.    TimeN2S       convert a time from numbers into a string
  939.    TimeS2N       convert a time from a string into numbers
  940.    WeekDay       get the day of the week
  941.    WeekDay1      returns the day of the week for a given date
  942.  
  943.                       Enhanced Key Codes
  944.  
  945.  
  946.  
  947. This is a list of the new key codes available when you use
  948. EnhKbd to enable enhanced keyboard support.  Note that the
  949. codes are direct from the BIOS, and may not always match what
  950. INKEY$ returns.  QuickBasic 4.5 provides only minimal support
  951. for the enhanced keys; QBX does much better.  As long as you
  952. use PBClone for input, of course, you don't have to worry about
  953. it.
  954.  
  955. The format used is ScanCode, ASCIIcode.
  956.  
  957.  
  958. Middle keypad key (num lock off):   0,76
  959. Middle key, with Control:           0,143
  960.  
  961.              plain     shift     control     alt
  962.              -----     -----     -------    -----
  963.    F11       0,133     0,135      0,137     0,139
  964.    F12       0,134     0,136      0,138     0,140
  965.  
  966. The middle cursor pad returns the same scan codes as the
  967. cursor/numeric pad when NumLock is off, but with an ASCII code
  968. of 224 instead of 0.  If you want the middle cursor pad and
  969. cursor/numeric pad to return the same values, you should have
  970. your code do this:
  971.  
  972.    ' ...get key code...
  973.    IF ASCIIcode = 224 AND ScanCode <> 0 THEN ASCIIcode = 0
  974.  
  975. Why test both ASCII and scan codes?  Because it is possible for
  976. the user to enter a plain 224 by holding ALT and using the
  977. numeric keypad, which could cause confusion.
  978.  
  979. The arrows in the middle cursor pad will return special codes
  980. if pressed in combination with an ALT key:
  981.  
  982.    up    arrow     0,152
  983.    down  arrow     0,160
  984.    left  arrow     0,155
  985.    right arrow     0,157
  986.  
  987. Finally, the arrow keys on either cursor pad will return
  988. special codes if pressed in combination with a CONTROL key:
  989.  
  990.                    middle pad     cursor/num pad
  991.                    ----------     --------------
  992.    up    arrow       224,141          0,141
  993.    down  arrow       224,145          0,145
  994.    left  arrow       224,115          0,115
  995.    right arrow       224,116          0,116
  996.  
  997.                         DOS Error Codes
  998.  
  999.  
  1000.  
  1001. Note that the number of error codes available depends on the
  1002. version of DOS in use.  Older versions return fewer error
  1003. codes, meaning that the nature of the error may not be
  1004. specified as precisely as you might like.  This is not a
  1005. complete list of all possible codes, but it covers the most
  1006. common ones.
  1007.  
  1008. The DOSErrM$ function can be used to generate a complete error
  1009. list if needed, current at least through DOS 3.31.  If later
  1010. versions of DOS have new error codes, I'm not aware of 'em.
  1011.  
  1012.  
  1013.   -1    Unable to read or write all of the data requested
  1014.    0    No error
  1015.    1    Invalid function number
  1016.    2    File not found
  1017.    3    Path not found
  1018.    4    No handle available (too many files open)
  1019.    5    Access denied (file already in use or "read only")
  1020.    6    Invalid handle
  1021.   15    Invalid disk drive
  1022.   16    Attempt to remove current directory
  1023.   18    No more matching files
  1024.   19    Disk is write-protected
  1025.   20    Unknown unit
  1026.   21    Drive not ready
  1027.   22    Invalid command
  1028.   23    Data CRC error
  1029.   25    Seek error
  1030.   26    Disk is not in DOS format
  1031.   27    Sector not found
  1032.   28    Printer is out of paper
  1033.   29    Write fault
  1034.   30    Read fault
  1035.   31    General failure
  1036.   32    Sharing violation
  1037.   33    Lock violation
  1038.   34    Invalid disk change
  1039.   35    No FCB available
  1040.   36    No room in file sharing buffer
  1041.   80    File already exists
  1042.   82    Unable to create subdirectory
  1043.  
  1044.